package com.greenold.task.utils;

import com.greenold.task.entity.JobBean;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;

/**
 * @author YueYang
 * Created on 2025/10/27 20:51
 * @version 1.0
 */
@Slf4j
public class JobUtils {


    /**
     * 创建定时任务
     *
     * @param scheduler 任务调度器
     * @param jobBean   任务Bean
     */
    public static void createJob(Scheduler scheduler, JobBean jobBean) {

        Class<? extends Job> jobClass = null;
        JobDetail jobDetail = null;
        Trigger trigger = null;

        try {
            jobClass = (Class<? extends Job>) Class.forName(jobBean.getJobClass());

            //创建该任务的任务详情对象
            jobDetail = JobBuilder.newJob(jobClass)
                    .storeDurably()
                    .withIdentity(jobBean.getJobName()) //设置任务详情的唯一信息
                    .build();

            //创建该任务的触发器对象
            trigger = TriggerBuilder.newTrigger()
                    .forJob(jobDetail) //设置该触发器绑定的任务详情
                    .withIdentity(jobBean.getJobName() + "_trigger") //设置触发器的唯一信息
                    .withSchedule(CronScheduleBuilder.cronSchedule(jobBean.getCronExpression()).withMisfireHandlingInstructionDoNothing()) //设置触发器的执行时间规则 错过任务不在执行
                    .build();

            //添加到调度器当中
            scheduler.scheduleJob(jobDetail, trigger);
            log.info("创建定时任务成功，任务类名字:{}", jobBean.getJobName());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    /**
     * 恢复定时任务
     *
     * @param scheduler 任务调度器
     * @param jobName   任务名称
     */
    public static void resumeJob(Scheduler scheduler, String jobName) {

        try {
            scheduler.resumeJob(JobKey.jobKey(jobName));
            log.info("恢复定时任务成功，任务类名字:{}", jobName);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除定时任务
     *
     * @param scheduler 任务调度器
     * @param jobName   任务名称
     */
    public static void deleteJob(Scheduler scheduler, String jobName) {

        try {
            scheduler.deleteJob(JobKey.jobKey(jobName));
            log.info("删除定时任务成功，任务类名字:{}", jobName);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }


    /**
     * 暂停定时任务
     *
     * @param scheduler 任务调度器
     * @param jobName   任务名称
     */
    public static void pauseJob(Scheduler scheduler, String jobName) {

        try {
            scheduler.pauseJob(JobKey.jobKey(jobName));
            log.info("暂停定时任务成功，任务类名字:{}", jobName);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }


    /**
     * 立即执行一次定时任务 前提是该任务已经执行过一次
     *
     * @param scheduler 任务调度器
     * @param jobName   任务名称
     */
    public static void runOnceJob(Scheduler scheduler, String jobName) {
        try {
            scheduler.triggerJob(JobKey.jobKey(jobName));
            log.info("立即执行一次定时任务成功，任务类名字:{}", jobName);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }


}
